home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / arith / iadd.c next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  11.4 KB  |  428 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  iadd.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. /*      iadd.c          RD, 23.12.89    */
  16.  
  17. #include <LEDA/impl/iint.h>
  18. #include <LEDA/impl/iloc.h>
  19.  
  20. void IplasI(a, b)
  21.         register pInteger a;
  22.     register const Integer *b;
  23. /* a+=b; */
  24. {   if (a->sign==b->sign) {
  25.         register int neededlength=a->length;
  26.         if (neededlength<b->length) {
  27.                 neededlength=b->length;
  28.         }
  29.         neededlength++;
  30.         if (neededlength>a->maxlength) {
  31.             register pPLACE newv;
  32.         register int oldlength=a->maxlength;
  33.             a->maxlength=neededlength;
  34.             newv=newvec(&a->maxlength);
  35.             a->length=cvadd(newv, a->vec, b->vec, a->length, b->length);
  36.             delvec(a->vec, oldlength);
  37.             a->vec=newv;
  38.             return;
  39.         } else {
  40.         a->length=cvadd(a->vec, a->vec, b->vec, a->length, b->length);
  41.             return;
  42.         }
  43.     } else {
  44.         /* Vorzeichen verschieden, subtrahiere betragsmaessig 
  45.                 kleineres von groesserem */
  46.         if ((b->length>a->length)||((b->length==a->length)
  47.                         &&vecgt(b->vec, a->vec, a->length))) {
  48.             /* |b|>|a| */
  49.             register int neededlength=b->length;
  50.             if (neededlength<=a->maxlength) {
  51.         a->length=cvsub(a->vec, b->vec, a->vec, 
  52.                 b->length, a->length);
  53.                 a->sign=b->sign;
  54.                 return;
  55.             } else {
  56.                 register pPLACE newv;
  57.                 register int oldlength=a->maxlength;
  58.                 a->maxlength=neededlength;
  59.                 newv=newvec(&a->maxlength);
  60.                 a->length=cvsub(newv, b->vec, a->vec, 
  61.                 b->length, a->length);
  62.                 delvec(a->vec, oldlength);
  63.                 a->vec=newv;
  64.                 a->sign=b->sign;
  65.                 return;
  66.             }
  67.         } else {
  68.                 /* |b| <= |a| */
  69.         register int l=a->length;
  70.         register PLACE * lp=&(a->vec[l-1]);
  71.                 cvecsubto(a->vec, b->vec, b->length);
  72.         while ((l>0)&&(! *lp)) {
  73.             l--; lp--;
  74.         }
  75.         a->length=l;
  76.                 if (!l)
  77.                         a->sign = PLUS;
  78.                 return;
  79. }   }   }       /* IplasI */
  80.  
  81. void IasIplI(sum, a, b)
  82.         register pInteger sum;
  83.     register const Integer *a, *b;
  84. /* sum=a+b; */
  85. {   register int neededlength;
  86.     if (sum==a) {
  87.         IplasI(sum, b);
  88.     return;
  89.     }
  90.     if (sum==b) {
  91.         IplasI(sum, a);
  92.     return;
  93.     }
  94.     if (a->sign==b->sign) {     /* Addition */
  95.         neededlength=a->length;
  96.         if (neededlength<b->length)
  97.             neededlength=b->length;
  98.         neededlength++;
  99.         if (neededlength>sum->maxlength) {
  100.             delvec(sum->vec, sum->maxlength);
  101.             sum->maxlength=neededlength;
  102.             sum->vec=newvec(&sum->maxlength);
  103.         }
  104.         sum->length=cvadd(sum->vec, a->vec, b->vec, a->length, b->length);
  105.         sum->sign=a->sign;
  106.         return;
  107.     } else {            /* Subtraktion */
  108.         neededlength=a->length;
  109.         if (neededlength<b->length)
  110.             neededlength=b->length;
  111.         if (neededlength>sum->maxlength) {      
  112.             delvec(sum->vec, sum->maxlength);
  113.             sum->maxlength=neededlength;
  114.             sum->vec=newvec(&sum->maxlength);
  115.         }
  116.         if ((b->length>a->length) || (b->length==a->length)
  117.                 && vecgt(b->vec, a->vec, a->length)) {
  118.             /* |b| > |a| */
  119.             sum->length=cvsub(sum->vec, b->vec, a->vec, 
  120.                 b->length, a->length);
  121.             sum->sign=b->sign;
  122.         return;
  123.         } else {
  124.             /*  |b| <= |a| */
  125.             sum->length=cvsub(sum->vec, a->vec, b->vec, 
  126.                 a->length, b->length);
  127.         if (!sum->length)
  128.         sum->sign=PLUS;
  129.         else
  130.                 sum->sign=a->sign;
  131.         return;
  132.         }
  133. }   }           /* IasIplI */
  134.  
  135. void ImiasI(a, b)
  136.         register pInteger a;
  137.     register const Integer *b;
  138. /* a-=b; */
  139. {   if (a->sign!=b->sign) {
  140.         register int neededlength=a->length;
  141.         if (neededlength<b->length) {
  142.                 neededlength=b->length;
  143.         }
  144.         neededlength++;
  145.         if (neededlength>a->maxlength) {
  146.             register pPLACE newv;
  147.             register int oldlength=a->maxlength;
  148.             a->maxlength=neededlength;
  149.             newv=newvec(&a->maxlength);
  150.             a->length=cvadd(newv, a->vec, b->vec, a->length, b->length);
  151.             delvec(a->vec, oldlength);
  152.             a->vec=newv;
  153.             return;
  154.         } else {
  155.             a->length=cvadd(a->vec, a->vec, b->vec, a->length, b->length);
  156.             return;
  157.         }
  158.     } else {
  159.         /* Vorzeichen gleich, subtrahiere betragsmaessig 
  160.                 kleineres von groesserem */
  161.         if ((b->length>a->length)||((b->length==a->length)
  162.                         &&vecgt(b->vec, a->vec, a->length))) {
  163.             /* |b|>|a| */
  164.             register int neededlength=b->length;
  165.             if (neededlength<=a->maxlength) {
  166.         a->length=cvsub(a->vec, b->vec, a->vec, 
  167.                 b->length, a->length);
  168.                 a->sign^=MINUS;
  169.                 return;
  170.             } else {
  171.                 register pPLACE newv;
  172.                 register int oldlength=a->maxlength;
  173.                 a->maxlength=neededlength;
  174.                 newv=newvec(&a->maxlength);
  175.                 a->length=cvsub(newv, b->vec, a->vec, 
  176.                 b->length, a->length);
  177.                 delvec(a->vec, oldlength);
  178.                 a->vec=newv;
  179.                 a->sign^=MINUS;
  180.                 return;
  181.             }
  182.         } else {
  183.                 /* |b| <= |a| */
  184.         register int l=a->length;
  185.         register PLACE * lp=&(a->vec[l-1]);
  186.                 cvecsubto(a->vec, b->vec, b->length);
  187.         while ((l>0)&&(! *lp)) {
  188.             l--; lp--;
  189.         }
  190.         a->length=l;
  191.                 if (!l)
  192.                         a->sign = PLUS;
  193.                 return;
  194. }   }   }       /* ImiasI */
  195.  
  196. void IasImiI(diff, a, b)
  197.         register pInteger diff;
  198.     register const Integer *a, *b;
  199. /* diff=a-b; */
  200. {   register int neededlength;
  201.     if (diff==a) {
  202.         ImiasI(diff, b);
  203.     return;
  204.     }
  205.     if (diff==b) {
  206.         ImiasI(diff, a);
  207.     return;
  208.     }
  209.     if (a->sign!=b->sign) {     /* Addition */
  210.         neededlength=a->length;
  211.         if (neededlength<b->length)
  212.             neededlength=b->length;
  213.         neededlength++;
  214.         if (neededlength>diff->maxlength) {
  215.             delvec(diff->vec, diff->maxlength);
  216.             diff->maxlength=neededlength;
  217.             diff->vec=newvec(&diff->maxlength);
  218.         }
  219.         diff->length=cvadd(diff->vec, a->vec, b->vec, a->length, b->length);
  220.         diff->sign=a->sign;
  221.         return;
  222.     } else {            /* Subtraktion */
  223.         neededlength=a->length;
  224.         if (neededlength<b->length)
  225.             neededlength=b->length;
  226.         if (neededlength>diff->maxlength) {      
  227.             delvec(diff->vec, diff->maxlength);
  228.             diff->maxlength=neededlength;
  229.             diff->vec=newvec(&diff->maxlength);
  230.         }
  231.         if ((b->length>a->length) || (b->length==a->length)
  232.                 && vecgt(b->vec, a->vec, a->length)) {
  233.             /*  |b| > |a| */
  234.             diff->length=cvsub(diff->vec, b->vec, a->vec, 
  235.                 b->length, a->length);
  236.             diff->sign=a->sign^MINUS;
  237.         return;
  238.         } else {
  239.             /*  |b| <= |a| */
  240.             diff->length=cvsub(diff->vec, a->vec, b->vec, 
  241.                 a->length, b->length);
  242.         if (!diff->length)
  243.         diff->sign=PLUS;
  244.         else
  245.                 diff->sign=a->sign;
  246.         return;
  247.         }
  248. }   }           /* IasImiI */
  249.  
  250. void Iinc(a)
  251.         register Integer *a;
  252. /* a++; */
  253. {   if (a->sign==PLUS) {
  254.         register int neededlength=a->length+1;
  255.     PLACE b=1;
  256.         if (neededlength>a->maxlength) {
  257.             register pPLACE newv;
  258.         register int oldlength=a->maxlength;
  259.             a->maxlength=neededlength;
  260.             newv=newvec(&a->maxlength);
  261.             a->length=cvadd(newv, a->vec, &b, a->length, 1);
  262.             delvec(a->vec, oldlength);
  263.             a->vec=newv;
  264.             return;
  265.         } else {
  266.         a->length=cvadd(a->vec, a->vec, &b, a->length, 1);
  267.             return;
  268.         }
  269.     } else {
  270.         /* Subtrahiere 1 von |a| */
  271.     register int l=a->length;
  272.     register PLACE * lp=&(a->vec[l-1]);
  273.     PLACE b=1;
  274.     cvecsubto(a->vec, &b, 1);
  275.     while ((l>0)&&(! *lp)) {
  276.         l--; lp--;
  277.     }
  278.     a->length=l;
  279.     if (!l)
  280.         a->sign = PLUS;
  281.     return;
  282. }   }           /* Iinc */
  283.  
  284. void Idec(a)
  285.         register Integer *a;
  286. /* a--; */
  287. {   if (a->sign==MINUS) {
  288.         register int neededlength=a->length+1;
  289.     PLACE b=1;
  290.         if (neededlength>a->maxlength) {
  291.             register pPLACE newv;
  292.         register int oldlength=a->maxlength;
  293.             a->maxlength=neededlength;
  294.             newv=newvec(&a->maxlength);
  295.             a->length=cvadd(newv, a->vec, &b, a->length, 1);
  296.             delvec(a->vec, oldlength);
  297.             a->vec=newv;
  298.             return;
  299.         } else {
  300.         a->length=cvadd(a->vec, a->vec, &b, a->length, 1);
  301.             return;
  302.     }   }
  303.     if (!a->length) {
  304.     a->sign=MINUS;
  305.     a->length=1;
  306.     a->vec[0]=1;
  307.     return;
  308.     } else {
  309.         /* Subtrahiere 1 von |a| */
  310.     register int l=a->length;
  311.     register PLACE * lp=&(a->vec[l-1]);
  312.     PLACE b=1;
  313.     cvecsubto(a->vec, &b, 1);
  314.     while ((l>0)&&(! *lp)) {
  315.         l--; lp--;
  316.     }
  317.     a->length=l;
  318.     return;
  319. }   }           /* Idec */
  320.  
  321.  
  322. BOOLEAN IeqI(a, b)
  323. /* return a==b; */
  324.         register const Integer *a, *b;
  325. {       if ((a->sign==b->sign)&&(a->length==b->length)&&
  326.                 veceq(a->vec, b->vec, a->length))
  327.                 return TRUE;
  328.         else
  329.                 return FALSE;
  330. }
  331.  
  332. BOOLEAN IgtI(a, b)
  333. /* return a>b; */
  334.         register const Integer *a, *b;
  335. {       if (a->sign==PLUS) {
  336.                 if (b->sign==MINUS)
  337.                         return TRUE;
  338.                 else {
  339.                         if ((a->length>b->length)||((a->length==b->length)
  340.                                         &&vecgt(a->vec, b->vec, a->length)))
  341.                                 return TRUE;
  342.                         else
  343.                                 return FALSE;
  344.                 }
  345.         } else {
  346.                 if (b->sign==PLUS)
  347.                         return FALSE;
  348.                 else {
  349.                         if ((a->length>b->length)||((a->length==b->length)
  350.                                     &&!vecgt(b->vec, a->vec, a->length)))
  351.                                 return FALSE;
  352.                         else
  353.                                 return TRUE;
  354. }       }       }       /* IgtI */
  355.  
  356. void Ineg(a)
  357.     register pInteger a;
  358. {    if (a->length)
  359.         a->sign^=MINUS;
  360. }
  361.  
  362. BOOLEAN IneI(a, b)
  363. /* return a!=b; */
  364.         const Integer *a, *b;
  365. {       return !IeqI(a, b);
  366. }
  367.  
  368. BOOLEAN IgeI(a, b)
  369. /* return a>=b; */
  370.         const Integer *a, *b;
  371. {       return !IgtI(b, a);
  372. }
  373.  
  374. BOOLEAN IltI(a, b)
  375. /* return a<b; */
  376.         const Integer *a, *b;
  377. {       return IgtI(b, a);
  378. }
  379.  
  380. BOOLEAN IleI(a, b)
  381. /* return a<=b; */
  382.         const Integer *a, *b;
  383. {       return !IgtI(a, b);
  384. }
  385.  
  386. BOOLEAN Ige0(a)
  387.     const Integer *a;
  388. {    return (a->sign==PLUS);
  389. }
  390.  
  391. BOOLEAN Igt0(a)
  392.     const Integer *a;
  393. {    return ((a->sign==PLUS)&&(a->length));
  394. }
  395.  
  396. BOOLEAN Ile0(a)
  397.     const Integer *a;
  398. {    return (!a->length || (a->sign==MINUS));
  399. }
  400.  
  401. BOOLEAN Ilt0(a)
  402.     const Integer *a;
  403. {    return (a->sign==MINUS);
  404. }
  405.  
  406. BOOLEAN Ieq0(a)
  407.     const Integer *a;
  408. {    return (!a->length);
  409. }
  410.  
  411. BOOLEAN Ieq1(a)
  412.     const Integer *a;
  413. {    if ((*(a->vec)==1)&&(a->length==1)&&(a->sign==PLUS))
  414.         return TRUE;
  415.     else
  416.         return FALSE;
  417. }
  418.  
  419. int sign(a)
  420.     const Integer *a;
  421. {    if (!a->length) { return 0; }
  422.         else {
  423.           if (a->sign==PLUS) { return 1; }
  424.           else { return -1; }
  425.         }
  426. }
  427.